package com.itheima.service.impl;

import com.itheima.dao.AccountDao;
import com.itheima.service.AccountService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.sql.SQLException;

/**
 * 账户Service类
 *
 * @author robin
 * @version 1.0
 * 目标对象：要被增强对象
 * @Transactional：加上在类上，那么该类中所有方法都会加上事务； 默认是对RunTimeException异常回滚！！
 * @Transactional(rollbackFor = SQLException.class): 当方法 中抛出SQLException时候，就会进行回滚
 */
@Service
@Transactional(rollbackFor = SQLException.class)
public class AccountServiceImpl implements AccountService {
    @Autowired
    AccountDao accountDao;

    /**
     * 选中该方法要被增强，就是要加上事务
     *
     * @param out   从谁转出
     * @param in    转入到谁
     * @param money 转账的金额
     */
    //@Transactional
    @Override
    public void transferMoney(String out, String in, Double money) throws SQLException {
        //转出
        accountDao.updateOutMoney(out, money);
        //场景1：转账程序抛出了一个运行时异常  例如：ArithmeticException 抛出的运行时异常
        //int i = 1 / 0;
        //场景2：模拟转账程序抛出 一个非运行是异常 例如：SQLException  是属于非运行时异常
        //导致结果：抛出非运行时异常时候，这里加上事务没有回滚成功；
        //解决：在抛出非运行时异常的时候，事务也能正常回滚
        if (true) {
            throw new SQLException("数据库SQL异常");
        }
        //转入
        accountDao.updateInMoney(in, money);


        //场景3：转账程序成功之后，向转账日志表中插入一条转账日志数据
        //场景4：转账程序失败之后，也得向转账日志表中插入一条转账日志数据
    }
}